home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #2 / Monster Media No. 2 (Monster Media)(1994).ISO / soundu / dg2.zip / MARKOV / MARKOV.BAS < prev    next >
BASIC Source File  |  1993-11-17  |  5KB  |  168 lines

  1. DECLARE SUB addword (word$, atword%, chainindex%, setword%)
  2. DECLARE FUNCTION getchain$ (number%)
  3. DECLARE SUB makewords (link$, w1$, w2$, w3$)
  4. DECLARE FUNCTION getword$ (fileno%)
  5. DEFINT A-Z
  6.  
  7. x$ = COMMAND$
  8. IF COMMAND$ = "" THEN
  9.         PRINT "MARKOV filein.ext fileout.ext"
  10.         END
  11. END IF
  12. x$ = x$ + " a b c"
  13. makewords x$, filein$, filefinal$, j$
  14.  
  15. fileno1 = FREEFILE
  16. OPEN filein$ FOR BINARY AS #fileno1
  17.  
  18. filein$ = "test.chn"
  19. fileno2 = FREEFILE
  20. OPEN filein$ FOR OUTPUT AS #fileno2
  21.  
  22. CLS
  23. PRINT "SHANNON'S MARKOV CHAIN WRITING PROGRAM"
  24. PRINT
  25. PRINT "Working... Number of chains created:";
  26.  
  27.  
  28. fw$ = getword$(fileno1)
  29. sw$ = getword$(fileno1)
  30. at = 0
  31. DO UNTIL EOF(fileno1)
  32.         at = at + 1
  33.         LOCATE 3, 38: PRINT at;
  34.         tw$ = getword$(fileno1)
  35.         chain$ = fw$ + " " + sw$ + " " + tw$
  36.         PRINT #fileno2, chain$
  37.         fw$ = sw$: sw$ = tw$
  38.         IF at = 5000 THEN
  39.                 PRINT "...maxed out"
  40.                 EXIT DO
  41.         END IF
  42. LOOP
  43.  
  44. CLOSE
  45.  
  46. DIM SHARED chaini(1 TO at, 1 TO 3)      'integer reference #'s
  47. DIM SHARED chainw$(1 TO at \ 2)         'words being referenced: assume half the words are repeats... hopefully
  48. DIM SHARED chainf$(1 TO 150)            'for probability branch
  49. DIM SHARED chainfi(1 TO 150)            'and index
  50.  
  51. RANDOMIZE TIMER
  52.  
  53. LOCATE 4, 1
  54. PRINT "   [SLOW]   Number of chains loaded:";
  55.  
  56. OPEN "test.chn" FOR INPUT AS #1
  57.         LINE INPUT #1, temp$
  58.         makewords temp$, w1$, w2$, w3$
  59.         chaini(1, 1) = 1: chaini(1, 2) = 2: chaini(1, 3) = 3
  60.         chainw$(1) = w1$: chainw$(2) = w2$: chainw$(3) = w3$
  61.         prev2 = 2: prev3 = 3
  62.         atw = 4 'at word #
  63.         atc = 2 'at chain #
  64.         topw = 3
  65.         FOR r = 2 TO at
  66.                 LOCATE 4, 38: PRINT r;
  67.                 LINE INPUT #1, temp$
  68.                 makewords temp$, w1$, w2$, w3$
  69.                 curr3 = 0
  70.                 addword w1$, atw, chaini(r, 1), prev2
  71.                 addword w2$, atw, chaini(r, 2), prev3
  72.                 addword w3$, atw, chaini(r, 3), curr3
  73.                 prev2 = prev3: prev3 = curr3
  74.                 IF curr3 > topw THEN topw = curr3
  75.         NEXT
  76. CLOSE #1
  77. PRINT "..." + LTRIM$(STR$(topw)) + " distinct words"
  78.  
  79. OPEN filefinal$ FOR OUTPUT AS #2
  80. link$ = getchain$(1)
  81. PRINT ""
  82. PRINT ""
  83.  
  84. oldr = 1
  85.  
  86. DO
  87.         makewords link$, w1$, w2$, w3$
  88.  
  89.         PRINT w1$; " ";
  90.         PRINT #2, w1$; " ";
  91.  
  92.         chain2$ = w2$ + " " + w3$
  93.         nf = 0
  94.         FOR r = 1 TO at
  95.                 x = LEN(chain2$)
  96.                 IF chaini(oldr, 2) = chaini(r, 1) AND chaini(oldr, 3) = chaini(r, 2) THEN
  97.                         nf = nf + 1
  98.                         chainf$(nf) = getchain$(r)
  99.                         chainfi(nf) = r
  100.                 END IF
  101.         NEXT
  102.         IF nf = 0 THEN
  103.                 oldr = INT(RND * (at)) + 1
  104.                 link$ = getchain$(oldr)
  105.                 PRINT "": PRINT ""
  106.                 PRINT #2, "":  PRINT #2, ""
  107.         ELSE
  108.                 sel = INT(RND * nf) + 1
  109.                 oldr = chainfi(sel)
  110.                 link$ = chainf$(sel)
  111.         END IF
  112. LOOP UNTIL INKEY$ <> ""
  113.  
  114. CLOSE
  115.  
  116. SUB addword (word$, atword, chainindex, setword)
  117.         IF setword <> 0 THEN
  118.                 chainindex = setword
  119.         ELSE
  120.                 found = 0
  121.                 FOR r = 1 TO atword
  122.                         IF chainw$(r) = word$ THEN
  123.                                 found = r
  124.                                 EXIT FOR
  125.                         END IF
  126.                 NEXT
  127.                 IF found = 0 THEN
  128.                         atword = atword + 1
  129.                         found = atword
  130.                         chainw$(found) = word$
  131.                 END IF
  132.                 chainindex = found
  133.                 setword = found
  134.         END IF
  135. END SUB
  136.  
  137. FUNCTION getchain$ (number)
  138.         getchain$ = chainw$(chaini(number, 1)) + " " + chainw$(chaini(number, 2)) + " " + chainw$(chaini(number, 3))
  139. END FUNCTION
  140.  
  141. FUNCTION getword$ (fileno)
  142.         x$ = ""
  143.         DO
  144.                 x$ = INPUT$(1, #fileno)
  145.                 IF LEN(x$) = 0 THEN EXIT DO
  146.                 IF ASC(x$) > 32 THEN EXIT DO
  147.         LOOP UNTIL EOF(fileno)
  148.         DO
  149.                 y$ = INPUT$(1, #fileno)
  150.                 IF LEN(y$) = 0 THEN EXIT DO
  151.                 IF ASC(y$) > 32 THEN
  152.                         x$ = x$ + y$
  153.                 ELSE
  154.                         EXIT DO
  155.                 END IF
  156.         LOOP UNTIL EOF(fileno)
  157.         getword$ = x$
  158. END FUNCTION
  159.  
  160. SUB makewords (link$, w1$, w2$, w3$)
  161.         x1 = INSTR(link$, " ")
  162.         x2 = INSTR(x1 + 1, link$, " ")
  163.         w1$ = MID$(link$, 1, x1 - 1)
  164.         w2$ = MID$(link$, x1 + 1, x2 - x1 - 1)
  165.         w3$ = MID$(link$, x2 + 1, LEN(link$) - x2)
  166. END SUB
  167.  
  168.